package 字符串;

public class Main {
    /*
    字面量 "hello world"：

字符串字面量 "hello world" 首先会存储在 常量池 中。如果在之前已经存在 "hello world" 字符串（比如 str1 和 str2），那么常量池中不会再创建新的对象，而是直接复用常量池中的 "hello world" 对象。
在这段代码中，str1 和 str2 已经使用了 "hello world"，因此常量池中已经存在这个字符串。
new String("hello world")：

每次执行 new String("hello world") 都会在 堆内存 中创建一个新的 String 对象，尽管常量池中已经存在 "hello world" 字符串字面量。
因此，str3 和 str4 分别创建了两个新的对象，但它们仍然引用的是常量池中的 "hello world" 作为它们的内部字符数组。
创建的对象数
每个 new String("hello world") 表达式都会创建一个新的 String 对象，但由于常量池中已经有 "hello world"，不会再在常量池中创建新的对象。
str3 和 str4 各自创建了 1 个新的对象（在堆中），总共 2 个新对象。
总结一下，String str3 = new String("hello world"); 和 String str4 = new String("hello world"); 各自创建了一个新的对象，因此总共创建了 2 个对象。
     */
    public static void main(String[] args) {
        // 这个为true 因为第二个字符串是从常量池中取出来的
        String str1 = "hello world";
        String str2 = "hello world";
        System.out.println(str1 == str2); //true

        //new的时候还会在堆内存中创建一个对象。
        String str3 = new
                String("hello world");
        ;
        String str4 = new
                String("hello world");
        ;
        System.out.println(str3.equals(str4)); //true
        System.out.println(str3 == (str4)); //false

        //新建一个字符串对象，并将其赋值给str1，此时str1和str3指向不同的对象，即使内容相同也不相等
        System.out.println(str1 == str3);

        StringBuffer sb=new StringBuffer("hello world");
        sb.append("stringbuffer");

        System.out.println(sb.toString());

    }
}
